package core

import (
	"fmt"
	"go-blog/global"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"log"
	"os"
	"time"
)

func InitMySql() *gorm.DB {
	m := global.Config.Mysql
	if m.Host == "" {
		return nil
	}
	dsn := m.Dsn()
	db, err := gorm.Open(mysql.Open(dsn), gormConfig(m.Prefix, m.Singular, m.LogMode))
	if err != nil {
		fmt.Println("请检查mysql配置")
		panic(err)
	}
	sqlDB, _ := db.DB()
	sqlDB.SetMaxIdleConns(10)                  // 设置连接池中的最大闲置连接数。
	sqlDB.SetMaxOpenConns(100)                 // 设置数据库的最大连接数量。
	sqlDB.SetConnMaxLifetime(10 * time.Second) // 设置连接的最大可复用时间。
	return db
}

func gormConfig(prefix string, singular bool, logMode string) *gorm.Config {
	_default := logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{
		SlowThreshold: 200 * time.Millisecond,
		LogLevel:      logger.Warn,
		Colorful:      true,
	})
	return &gorm.Config{
		Logger: _default.LogMode(getLogMode(logMode)),
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   prefix,
			SingularTable: singular,
		},
		DisableForeignKeyConstraintWhenMigrating: true,
	}
}

// 根据字符串获取对应 LogLevel
func getLogMode(str string) logger.LogLevel {
	switch str {
	case "silent", "Silent":
		return logger.Silent
	case "error", "Error":
		return logger.Error
	case "warn", "Warn":
		return logger.Warn
	case "info", "Info":
		return logger.Info
	default:
		return logger.Info
	}
}
